<!doctype html>
<!--
This test creates a data channel between two local PeerConnection instances
and ensures that an empty string sent by one is received by the second.
-->

<html>
<head>
  <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
  <title>RTCPeerConnection Data Channel Empty String Test</title>
</head>
<body>
  <div id="log"></div>
  <h2>Messages exchanged</h2>
  <div id="msg"></div>

  <!-- These files are in place when executing on W3C. -->
  <script src="/resources/testharness.js"></script>
  <script src="/resources/testharnessreport.js"></script>
  <script type="text/javascript">
  var test = async_test('Can send empty strings across a WebRTC data channel.');

  var gFirstConnection = null;
  var gSecondConnection = null;
  var sendChannel = null;
  var receiveChannel = null;

  var onReceiveChannel = function (event) {
    receiveChannel = event.channel;
    receiveChannel.onmessage = onReceiveMessage;
  };


  // When the data channel is open, send an empty string message
  // followed by a message that contains the string "done".
  var onSendChannelOpen = test.step_func(function (event) {
    var msgEl = document.getElementById('msg');
    sendChannel.send('');
    msgEl.innerHTML += 'Sent: [empty string]<br>';
    sendChannel.send('done');
    msgEl.innerHTML += 'Sent: "done"<br>';
  });

  // Check the messages received on the other side.
  // There should be an empty string message followed by a message that
  // contains the string "done".
  // Pass/Fail the test according to the messages received
  var emptyMessageReceived = false;
  var onReceiveMessage = test.step_func(function (event) {
    var msgEl = document.getElementById('msg');
    msgEl.innerHTML += 'Received: ' +
        (event.data ? '"' + event.data + '"' : '[empty string]') + '<br>';
    if (emptyMessageReceived) {
      assert_equals(event.data, 'done', 'The "done" message was not received');
      test.done();
    }
    else {
      assert_equals(event.data, '', 'Empty message not received');
      emptyMessageReceived = true;
    }
  });

  function exchangeDescription(pc1, pc2) {
    return function() {
      return pc1.setRemoteDescription(pc2.localDescription);
    };
  }

  test.step(function() {
    gFirstConnection = new RTCPeerConnection(null);
    test.add_cleanup(() => gFirstConnection.close());

    gSecondConnection = new RTCPeerConnection(null);
    test.add_cleanup(() => gSecondConnection.close());

    gFirstConnection.onicecandidate = e => gSecondConnection.addIceCandidate(e.candidate);
    gSecondConnection.onicecandidate = e => gFirstConnection.addIceCandidate(e.candidate);

    gSecondConnection.ondatachannel = onReceiveChannel;

    // Note the data channel will preserve the order of messages
    // exchanged over it by default.
    sendChannel = gFirstConnection.createDataChannel('sendDataChannel');
    sendChannel.onopen = onSendChannelOpen;

    gFirstConnection.createOffer()
    .then(gFirstConnection.setLocalDescription.bind(gFirstConnection))
    .then(exchangeDescription(gSecondConnection, gFirstConnection))
    .then(function() {
      return gSecondConnection.createAnswer();
    })
    .then(gSecondConnection.setLocalDescription.bind(gSecondConnection))
    .then(exchangeDescription(gFirstConnection, gSecondConnection))
    .catch(test.step_func(function(e) {
      assert_unreached('Error ' + e.name + ': ' + e.message);
     }));
  });
</script>

</body>
</html>

